package com.mini.core.dao;

import java.util.Collection;
import java.util.List;

import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;

import com.alibaba.druid.sql.visitor.functions.Char;
import com.mini.core.BaseEntity;
import com.mini.core.MiniDaoException;
import com.mini.core.PageResult;
import com.mini.core.grammar.DbProducer;
import com.mini.core.grammar.Record;

/**
 * 通用Dao对象
 * @author sxjun
 * 2016-1-15
 */
public class MiniDao1 implements IMiniDao1
{
    private DbProducer dbProducer;

    public void setDbProducer(DbProducer dbProducer) {
        this.dbProducer = dbProducer;
    }
    
    /**
     * 执行sql语句
     * @param sql 执行语句
     * @return int
     */
    public int execute(String sql) {
        return dbProducer.update(sql);
    }
    
    /**
     * 执行sql语句
     * @param sql 执行语句
     * @param paras 参数
     * @return int
     */
    public int execute(String sql, Object... paras) {
        return dbProducer.update(sql, paras);
    }

    /**
     * 批量执行sql语句
     * @param sqls 执行语句集合
     * @return int[]
     */
    public int[] executebatch(String[] sqls) {
        return dbProducer.batch(sqls);
    }
    
    /**
     * 批量执行sql语句
     * @param sql 执行语句
     * @param batchArgs 参数
     * @param batchSize 执行量
     * @param pss
     * @return int[][]
     */
    public int[][] executebatch(String sql, Collection<Object> batchArgs, int batchSize, ParameterizedPreparedStatementSetter<Object> pss) {
        return dbProducer.batch(sql, batchArgs, batchSize, pss);
    }
    
    /**
     * 查询单个字段
     * @param sql 执行语句
     * @return String
     */
    public String queryString(String sql) {
		return dbProducer.queryForObject(sql, String.class);
	}

    /**
     * 查询单个字段
     * @param sql 执行语句
     * @param args 参数
     * @return String
     */
	public String queryString(String sql, Object... args) {
		return  dbProducer.queryForObject(sql, String.class,args);
	}
	
	/**
     * 查询单个字段集合，只支持简单基本类型（Integer, Double, Float, Long, Short, Boolean, Byte, Char）的查询
     * @param sql 执行语句
     * @return List<T>
     */
    public <T> List<T> queryList(String sql,Class<T> clazz){
    	if(clazz.isPrimitive()
    			||Integer.class.getName().equals(clazz.getName())
    			||Double.class.getName().equals(clazz.getName())
    			||Float.class.getName().equals(clazz.getName())
    			||Long.class.getName().equals(clazz.getName())
    			||Short.class.getName().equals(clazz.getName())
    			||Boolean.class.getName().equals(clazz.getName())
    			||Byte.class.getName().equals(clazz.getName())
    			||Char.class.getName().equals(clazz.getName()))
    		return dbProducer.queryForList(sql, clazz);
    	else
    		throw new MiniDaoException("查询单个字段集合，只支持简单基本类型（Integer(int), Double(double), Float(float), Long(long), Short(short), Boolean(boolean), Byte(byte), Char(char)）的查询!");
    }
    
    /**
     * 查询单个字段集合，只支持简单基本类型（Integer, Double, Float, Long, Short, Boolean, Byte, Char）的查询
     * @param sql 执行语句
     * @param args 参数
     * @return List<T>
     */
	public <T> List<T> queryList(String sql, Class<T> clazz, Object... args){
		if(clazz.isPrimitive())
    		return dbProducer.queryForList(sql, clazz, args);
    	else
    		throw new MiniDaoException("查询单个字段集合，只支持简单基本类型（Integer, Double, Float, Long, Short, Boolean, Byte, Char）的查询!");
	}

	/**
	 * 查询单个字段
	 * @param sql 执行语句
	 * @return int
	 */
	public int queryInt(String sql) {
		return dbProducer.queryForObject(sql,Integer.class);
	}

	/**
	 * 查询单个字段
	 * @param sql 执行语句
	 * @param args 参数
	 * @return int
	 */
	public int queryInt(String sql, Object... args) {
		return dbProducer.queryForObject(sql,Integer.class,args);
	}
	
	/**
	 * 根据ID查找对象
	 * @param clazz 类<必须继承BaseEntity>
	 * @param primaryKey
	 * @return T extends BaseEntity
	 */
	public <T extends BaseEntity> T findById(Class<? extends BaseEntity> clazz, Object primaryKey) {
		return (T) dbProducer.findById(clazz, primaryKey);
	}
	
	/**
	 * 查找Record的List对象
	 * @param sql 执行语句
	 * @return List<Record>
	 */
	public List<Record> findRecordList(String sql) {
		return dbProducer.find(sql);
	}
	
	/**
	 * 查找Record的List对象
	 * @param sql 执行语句
	 * @param args 参数
	 * @return List<Record>
	 */
	public List<Record> findRecordList(String sql, Object... args) {
		return dbProducer.find(sql, args);
	}
	
	/**
	 * 查找BaseEntity的List对象
	 * @param sql 执行语句
	 * @param clazz 类<必须继承BaseEntity>
	 * @return T extends BaseEntity
	 */
	public <T extends BaseEntity> List<T> findList(String sql,Class<? extends BaseEntity> clazz) {
		return dbProducer.findEntity(sql,clazz);
	}
	
	/**
	 * 查找BaseEntity的List对象
	 * @param sql 执行语句
	 * @param clazz 类<必须继承BaseEntity>
	 * @param args 参数
	 * @return T extends BaseEntity
	 */
	public <T extends BaseEntity> List<T> findList(String sql,Class<? extends BaseEntity> clazz, Object... args) {
		return dbProducer.findEntity(sql,clazz,args);
	}
	
	/**
	 * 查找单个Record对象
	 * @param sql 执行语句
	 * @return Record
	 */
	public Record findRecord(String sql) {
        return dbProducer.findFirst(sql);
    }

	/**
	 * 查找单个Record对象
	 * @param sql 执行语句
	 * @param args 参数
	 * @return Record
	 */
    public Record findRecord(String sql, Object... args) {
        return dbProducer.findFirst(sql, args);
    }
    
    /**
     * 查找单个BaseEntity对象
     * @param sql 执行语句
     * @param clazz 类<必须继承BaseEntity>
     * @return T extends BaseEntity
     */
    public <T extends BaseEntity> T find(String sql,Class<? extends BaseEntity> clazz) {
        return dbProducer.findFirst(sql,clazz);
    }

    /**
     * 查找单个BaseEntity对象
     * @param sql 执行语句
     * @param clazz 类<必须继承BaseEntity>
     * @param args 参数
     * @return T extends BaseEntity
     */
    public <T extends BaseEntity> T find(String sql,Class<? extends BaseEntity> clazz, Object... args) {
    	return dbProducer.findFirst(sql,clazz,args);
    }

    /**
     * 插入数据
     * @param record BaseEntity或Record对象 <必须继承Record>
     * @return int
     */
    public <T extends Record>  int insert(T record) {
        return dbProducer.save(record);
    }
    
    /**
     * 更新数据
     * @param record BaseEntity或Record对象 <必须继承Record>
     * @return int
     */
    public <T extends Record> int update(T record) {
        return dbProducer.update(record);
    }
    
    /**
     * 删除数据
     * @param record BaseEntity或Record对象 <必须继承Record>
     * @return int
     */
    public <T extends Record> int delete(T record) {
        return dbProducer.delete(record);
    }
    
    /**
	 * 根据ID删除数据
	 * @param clazz 类<必须继承BaseEntity>
	 * @param primaryKey
	 * @return int
	 */
	public int deleteById(Class<? extends BaseEntity> clazz, Object primaryKey){
		return dbProducer.deleteById(clazz, primaryKey);
	}
    
    /**
     * 获取分页Record数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param sql 执行语句
     * @return List<Record>
     */
    public List<Record> paginate(int pageNumber, int pageSize, String sql){
    	return dbProducer.paginateRecord(pageNumber, pageSize, sql);
    }
    
    /**
     * 获取分页Record数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param sql 执行语句
     * @param args 参数
     * @return List<Record>
     */
    public List<Record> paginate(int pageNumber, int pageSize, String sql, Object... args){
    	return dbProducer.paginateRecord(pageNumber, pageSize, sql, args);
    }
    
    /**
     * 获取分页BaseEntity数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param clazz 类<必须继承BaseEntity>
     * @param sql 执行语句
     * @return List<T extends BaseEntity>
     */
    public <T extends BaseEntity> List<T> paginate(int pageNumber, int pageSize, Class<? extends BaseEntity> clazz, String sql){
    	return dbProducer.paginateEntity(pageNumber, pageSize, clazz, sql);
    }
    
    /**
     * 获取分页BaseEntity数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param clazz 类<必须继承BaseEntity>
     * @param sql 执行语句
     * @param args 参数
     * @return List<T extends BaseEntity>
     */
    public <T extends BaseEntity> List<T> paginate(int pageNumber, int pageSize, Class<? extends BaseEntity> clazz, String sql, Object... args){
    	return dbProducer.paginateEntity(pageNumber, pageSize, clazz, sql, args);
    }

    /**
     * 获取分页Record数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param sql 执行语句
     * @return PageResult<Record>
     */
    public PageResult<Record> paginateResult(int pageNumber, int pageSize, String sql){
    	return dbProducer.paginate(pageNumber, pageSize, sql);
    }
    
    /**
     * 获取分页Record数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param sql 执行语句
     * @param args 参数
     * @return PageResult<Record>
     */
    public PageResult<Record> paginateResult(int pageNumber, int pageSize, String sql, Object... args){
    	return dbProducer.paginate(pageNumber, pageSize, sql, args);
    }
    
    /**
     * 获取分页BaseEntity数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param clazz 类<必须继承BaseEntity>
     * @param sql 执行语句
     * @return PageResult<T>
     */
    public <T extends BaseEntity> PageResult<T> paginateResult(int pageNumber, int pageSize, Class<? extends BaseEntity> clazz, String sql){
    	return dbProducer.paginate(pageNumber, pageSize, sql, clazz);
    }
    
    /**
     * 获取分页BaseEntity数据
     * @param pageNumber 记录行的偏移量
     * @param pageSize 记录行的最大数目
     * @param clazz 类<必须继承BaseEntity>
     * @param sql 执行语句
     * @param args 参数
     * @return PageResult<T>
     */
    public <T extends BaseEntity> PageResult<T> paginateResult(int pageNumber, int pageSize, Class<? extends BaseEntity> clazz, String sql, Object... args){
    	return dbProducer.paginate(pageNumber, pageSize, sql, clazz, args);
    }
}
